﻿//============================================================================================================================
//
//            Denne klasse skal importere date fra et ERP system. klassen er statisk og er tiltænkt som
//            støttepædagog til DBConnection.cs
//            Forfatter: Lars S Jacobsen
//              
//============================================================================================================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;
using Exceptions;

namespace Model
{
    public static class XmlParser
    {
        /// <summary>
        /// Returnerer brandData fra en XML fil. Throws InvalidXmlValueException
        /// </summary>
        /// <returns></returns>
        public static List<Brand> ImportBrandData(string path)
        {
            List<Brand> brandliste = new List<Brand>(); // listen der i sidste ende skal returneres.
            string xmlPath = path;//"xml/TestSet1_brands_20130221_153004.xml"; // stien til vores XML dokument.

               //hvis filen ikke eksisterer
            if(!File.Exists(xmlPath))
            {
                // så kast en exception
                throw new InvalidPathException("Filen der blev søgt på eksisterer ikke");
            }

            XmlTextReader reader = new XmlTextReader(xmlPath);

            if (!File.Exists(xmlPath))
            {
                throw new InvalidPathException("Filen du prøver at åbne eksisterer ikke.");
            }


            bool tempNameFound = false;
            bool tempCodeFound = false;


            string tempBrandname = ""; // midlertidig lager til Brandname.
            int tempBrandCode = 0; // midlertidig lager til BrandCode.


            while (reader.Read()) // så længe der er flere "nodes" i xml dokumentet.
            {
                

              //når vi støder på BrandCode noden
                if (reader.Name == "BrandCode")
                {
                        // så forsøg at parse den.
                    if (int.TryParse(reader.ReadString(), out tempBrandCode))
                    {
                        //vi har allerede lagt værdien ind i tempBrandCode, så vi behøver ikke at gøre mere.
                        tempCodeFound = true;
                    }
                    else
                    {
                        //finder linjenummeret for der hvor fejlen er opstået.
                        int lineNumber = reader.LineNumber;
                                       // int linePosition = reader.LinePosition;
                        
                        throw new InvalidXmlValueException("Der er en ugyldig værdi i "+ lineNumber);
                    }
                }

                if (reader.Name == "BrandName")
                {
                    tempBrandname = reader.ReadString();
                    tempNameFound = true;
                }

                
                if(tempCodeFound && tempNameFound)
                {
                    //tilføjer et nyt objekt til vores brandliste så vi kan holde styr på hvor mange brands vi har.
                brandliste.Add(new Brand(tempBrandCode.ToString(), tempBrandname));
                    tempCodeFound = false;
                    tempNameFound = false;
                }
            }
            return brandliste;
        }
        /// <summary>
        /// Importerer en liste af Kategorier fra en XML fil. throws InvalidPathException, InvalidXmlValueException
        /// </summary>
        /// <returns></returns>
        public static List<Category> importCategoryData(string path)
        {
            List<Category> CategorytList = new List<Category>();
            string Path = path; // stien hen til vores XML fil

            if (!File.Exists(path))
            {
                throw new InvalidPathException("Der findes ingen xml filer med det givende navn i den givne sti");
            }

            XmlTextReader reader = new XmlTextReader(path);

            string tempLevel = "", tempName = "", tempDesc = "", tempBrandCode = "";
            int tempID = 0;
            
            bool tempLevelFound = false, tempNameFound = false, tempDescFound = false, tempBrandCodeFound = false, tempIDFound = true;
            
            while (reader.Read())
            {
                if (reader.Name == "Level")
                {
                    tempLevel = reader.ReadString();
                    tempLevelFound = true;
                }

                if (reader.Name == "Id")
                {
                        //hvis vi kan oversætte teksten til integer
                    if (int.TryParse(reader.ReadString(), out tempID))
                    {
                        // vi har allerede lagt værdien ud hvor den skal være så vi opdatere vores bool flag så metoden ved at vi har fundet den rigtige.
                        tempIDFound = true;
                    }
                        //hvis vi ikke kan oversætte teksten til integer
                    else
                    {
                        int lineNumber = reader.LineNumber;
                        throw new InvalidXmlValueException("Der er en ugyldig værdi i linje " + lineNumber);
                    }
                }

                if (reader.Name == "Name")
                {
                    tempName = reader.ReadString();
                    tempNameFound = true;
                }

                if (reader.Name == "Description")
                {
                    tempDesc = reader.ReadString();
                    tempDescFound = true;
                }

                if (reader.Name == "BrandCode")
                {
                    tempBrandCode = reader.ReadString();
                    tempBrandCodeFound = true;
                }

                if (tempLevelFound && tempNameFound && tempDescFound && tempBrandCodeFound && tempIDFound)
                {
                    CategorytList.Add(new Category(tempID, tempLevel, tempName, tempDesc, tempBrandCode));
                    
                    tempLevelFound = false;
                    tempNameFound = false;
                    tempDescFound = false;
                    tempBrandCodeFound = false;
                    tempIDFound = false;
                }
            }

            return CategorytList;
        }       
        /// <summary>
        /// Returnerer en liste af Produkter fra en XML fil. throws InvalidPathException, InvalidDateTimeException
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static List<Product> importProduktdata(string path)
        {
            List<Product> ProductList = new List<Product>();

            string Path = path;

            if (!File.Exists(path))
            {
                throw new InvalidPathException("Der er ingen fil på den angivne sti");
            }

            string tempProductNumber = "";
            string tempBrandCode = "";
            string tempLevel = "";
            string tempCategory = "";
            string tempStatus = "";
            decimal tempprice = 0m;
            DateTime tempLaunchDate = DateTime.Now;

            bool tempProductNumberFound = false, tempBrandCodeFound = false, tempLevelFound = false, tempCategoryFound = false, tempStatusFound = false, tempPriceFound = false, tempLaunchDateFound = false;

            XmlTextReader reader = new XmlTextReader(path);

            while (reader.Read())
            {
                if (reader.Name == "ProductNumber")
                {
                    tempProductNumber = reader.ReadString();
                    tempProductNumberFound = true;
                }

                if(reader.Name == "Price")
                {
                    if (decimal.TryParse(reader.ReadString(), out tempprice))
                    {
                        tempPriceFound = true;
                    }
                    else
                    {
                        int lineNumber = reader.LineNumber;
                        throw new InvalidXmlValueException("Der er ugyldig data i linje " + "");
                    }
                }

                if(reader.Name == "BrandCode")
                {
                    tempBrandCode = reader.ReadString();
                    tempBrandCodeFound = true;
                }

                if(reader.Name == "AvailabilityLevel")
                {
                    tempLevel = reader.ReadString();
                    tempLevelFound = true;
                }

                if(reader.Name == "Category")
                {
                    tempCategory = reader.ReadString();
                    tempCategoryFound = true;
                }

                if(reader.Name == "ProductStatus")
                {
                    tempStatus = reader.ReadString();
                    tempStatusFound = true;
                }

                if(reader.Name == "LaunchDate")
                {
                    if(DateTime.TryParse(reader.ReadString(),out tempLaunchDate))
                    {
                        // gør intet
                        tempLaunchDateFound = true;
                    }

                    else
                    {
                        int LineNumber = reader.LineNumber;
                        throw new InvalidDateTimeExceptions("Der er ugyldig data i linje " + LineNumber);
                    }
                }

                if(tempProductNumberFound && tempBrandCodeFound && tempLevelFound && tempCategoryFound && tempStatusFound && tempPriceFound && tempLaunchDateFound)
                {
                    ProductList.Add(new Product(tempProductNumber,tempBrandCode, tempLevel, tempCategory, tempStatus, tempprice ,tempLaunchDate));
                    tempProductNumberFound = false;
                    tempBrandCodeFound = false;
                    tempLevelFound = false;
                    tempCategoryFound = false; 
                    tempStatusFound = false; 
                    tempPriceFound = false;
                    tempLaunchDateFound = false;
                }
            }

            return ProductList;   
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static List<ProductDetail> ImportProduktDetailData(string path)
        {
            List<ProductDetail> DetailList = new List<ProductDetail>();
            
            string tempDesc = "";
            string tempLaunguage = "";
            string tempReplacemen = "";
            string tempProductNumber = "";
            bool tempDescFound = false, tempLanguageFound = false, tempReplacementFound = false, tempProductNumberFound = false;

            if (!File.Exists(path))
            {
                throw new InvalidPathException("Filen på den angivne sti findes ikke");
            }

            XmlTextReader reader = new XmlTextReader(path);
            while (reader.Read())
            {
                if (reader.Name == "Description")
                {
                    tempDesc = reader.ReadString();
                    tempDescFound = true;
                }

                if (reader.Name == "Language")
                {
                    tempLaunguage = reader.ReadString();
                    tempLanguageFound = true;
                }

                if (reader.Name == "ReplacementNotes")
                {
                    tempReplacemen = reader.ReadString();
                    tempReplacementFound = true;
                }

                if(reader.Name == "ProductNumber")
                {
                    tempProductNumber = reader.ReadString();
                    tempProductNumberFound = true;                    
                }
                if (tempDescFound && tempLanguageFound && tempReplacementFound && tempProductNumberFound)
                {
                    tempDescFound = false;
                    tempLanguageFound = false;
                    tempReplacementFound = false;

                    DetailList.Add(new ProductDetail(tempLaunguage, tempDesc, tempReplacemen, tempProductNumber));
                }
            }

            
            return DetailList;
        }
    }
}
